package day26.homework;

public class ReturnExceptionDemo { 

    // 方法A：演示在try-catch块中抛出异常，但finally块仍会执行的情况
    // 该方法声明抛出Exception，表示调用者需要处理这个异常
    public static void methodA() throws Exception { 
        try { 
            System.out.println("进入方法A"); 
            // 在try块中主动抛出一个异常，用于演示异常处理机制
            throw new Exception("制造异常");
        } finally { 
            // finally块中的代码无论是否发生异常都会执行
            System.out.println("A方法的finally"); 
        } 
    } 
    
    // 方法B：演示在有return语句的情况下，finally块仍然会执行
    // 该方法返回int类型值
    public static int methodB() { 
        try { 
            System.out.println("进入方法B"); 
            // try块中的return语句并不会立即返回，会先执行finally块
            return 1; 
        } finally { 
            // finally块中的代码会执行，但这里有一个特殊情况：
            // 如果finally块中有return语句，它会覆盖try块中的return语句
            System.out.println("B方法的finally"); 
            // 这个return语句会覆盖上面try块中的return 1
            return 2; 
        } 
    } 
    
    // 主方法：程序入口，用于测试methodA和methodB两个方法
    public static void main(String[] args) { 
        try { 
            // 调用methodA方法，该方法可能抛出异常
            methodA(); 
        } catch (Exception e) { 
            // 捕获并处理methodA抛出的异常，打印异常信息
            System.out.println(e.getMessage()); 
        } 
        // 调用methodB方法并接收返回值
        int i = methodB(); 
        // 打印methodB的返回值
        System.out.println(i); 
    }
}

/*
 * 输出结果分析：
 * 进入方法A     -> 调用methodA，首先执行try块中的打印语句
 * A方法的finally -> 执行methodA中的finally块
 * 制造异常      -> 捕获到异常后，在main方法中打印异常信息
 * 进入方法B     -> 调用methodB，执行try块中的打印语句
 * B方法的finally -> 执行methodB中的finally块（注意：这里会覆盖try中的return值）
 * 2            -> 由于finally中有return 2，所以最终返回2而不是1
 * 
 * 从输出结果中可以看到，finally块中的代码无论是否发生异常都会执行
 * 在有return语句的情况下，finally块仍然会执行，但会覆盖try块中的return语句
 */